package com.bjsxt.ego.common.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;

import org.springframework.stereotype.Component;


/**
 *  文件相关的工具类
 * @author 章鸿敏
 *
 */
@Component("fileUtil")
public class FileUtil
{
	/**
	 * 读取一个文件内容,
	 * @param is	输入流
	 * @return
	 */
	public String readFile(InputStream is)
	{
		StringBuffer sb = new StringBuffer();
		BufferedReader br = null;
		try
		{
			br = new BufferedReader(new InputStreamReader(is, "utf-8"));
			String line = "";
			while((line = br.readLine()) != null)
			{
				/* 处理注释*/
				line = line.trim();
				if ("".equalsIgnoreCase(line) || line.startsWith("//"))
				{
					continue;
				}
				sb.append(line);
			}
		} catch (IOException e)
		{
			ConstatFinalUtil.LOGGER.error("读取输入流内容失败了:",e);
		}finally
		{
			try
			{
				if(br != null)
				{
					br.close();
				}
			} catch (IOException e)
			{
				ConstatFinalUtil.LOGGER.error("读取输入流内容关闭时失败了:",e);
			}
		}
		return sb.toString() ;
	}
	
	
	/**
	 * 读取一个文件的内容
	 * @param sourceFile	原始文件内容
	 * @return	文件内容的字符串
	 */
	public String readFile(File sourceFile)
	{
		try
		{
			return this.readFile(new FileInputStream(sourceFile));
		} catch (FileNotFoundException e)
		{
			ConstatFinalUtil.LOGGER.error("文件不存在;文件路径:{}",sourceFile,e);
		}
		return "";
	}
	
	/**
	 *  文件拷贝
	 * @param souFile
	 * @param tarFile
	 * @return
	 */
	public boolean copyFile(File souFile,File tarFile)
	{
		/*判断目标文件的上一层目录是否存在*/
		if (!tarFile.getParentFile().exists())
		{
			tarFile.getParentFile().mkdirs();
		}
		try
		{
			return this.copyFile(new FileInputStream(souFile), new FileOutputStream(tarFile));
		} catch (FileNotFoundException e)
		{
			ConstatFinalUtil.LOGGER.error("文件拷贝失败了;原始文件:{},目标文件:{}," , souFile,tarFile,e);
		}
		return false;
	}
	
	/**
	 *  文件拷贝(流)
	 * @param is
	 * @param os
	 * @return
	 */
	public boolean copyFile(InputStream is,OutputStream os)
	{
		/*准备两根管子，输入和输出*/
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		
		bis = new BufferedInputStream(is);
		bos = new BufferedOutputStream(os);
		
		/*准备容器*/
		byte[] b =new byte[1024];
		int len = 0;
		try
		{
			while((len = bis.read(b)) !=-1)
			{
				bos.write(b, 0, len);
			}
			return true;
		} catch (IOException e)
		{
			ConstatFinalUtil.LOGGER.error("文件拷贝(流)失败了;",e);
		}finally
		{
			try
			{
				/*关闭并清空,方便垃圾回收机制回收*/
				if (bis != null)
				{
					bis.close();
					bis = null;
				}
			} catch (IOException e)
			{
				ConstatFinalUtil.LOGGER.error("文件关闭(流)失败了;",e);
			}
			try
			{
				/*关闭并清空,方便垃圾回收机制回收*/
				if (bos != null)
				{
					bos.close();
					bos = null;
				}
			} catch (IOException e)
			{
				ConstatFinalUtil.LOGGER.error("文件关闭(流)失败了;",e);
			}
		}
		return false;
	}
}
